package spm.project.rememberme;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class DualPlayer extends Activity{
	RadioButton p1 , p2;
	TextView v1 , v2;
//	boolean currentPlayer =true;
	boolean statusPlayer1 ;
	boolean statusPlayer2 ;
//	private Player player1;
//	private Player player2;
	int Player1Score = 0;
	int Player2Score = 0;
//	int turn1;
//	int turn2;
	int row, column;
	private static int ROW_COUNT = -1;
	private static int COL_COUNT = -1;
	private Context context;
	private Drawable backImage;
	private int[][] cards;
	private List<Drawable> images;
	private Card firstCard;
	private Card seconedCard;
	private ButtonListener buttonListener;
	private int size;
	private static Object lock = new Object();
	int turns;
	private TableLayout mainTable;
	private UpdateCardsHandler handler;
	String level , time;
	int score;
	RadioGroup g;
	int checkEndGame = 0;
	int height , width;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.dualplayer);
		DisplayMetrics metrics = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(metrics);
		height = metrics.heightPixels;
		width = metrics.widthPixels;
		
		backImage = getResources().getDrawable(R.drawable.icon);
		handler = new UpdateCardsHandler();
		loadImages();
		buttonListener = new ButtonListener();
		p1 = (RadioButton) findViewById(R.id.radioPlayer1);
		p2 = (RadioButton) findViewById(R.id.radioPlayer2);
		g = (RadioGroup) findViewById(R.id.radioGroup1);
		mainTable = (TableLayout) findViewById(R.id.Table);
		
		statusPlayer1 = true;
		context = mainTable.getContext();
	
		newGame(5,6);
	
	}
	public void displayDialog(int score1 , int score2){
		AlertDialog.Builder alert = new AlertDialog.Builder(context);
		alert.setTitle("Game Result");
		if (score1 > score2){
			alert.setMessage("Player 1 Win !");
		} else if (score2 > score1){
			alert.setMessage("Player 2 Win!");
		}else if (score1 == score2) {
			alert.setMessage("Game Draw");
		}
		alert.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog,int id) {
				finish();
			}
		  } );
		alert.setPositiveButton("Play Again", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog,int id) {
				// if this button is clicked, close
				// current activity
				PlayAgain();
			}
		  });
		alert.show();
	}
	public void PlayAgain(){
		Intent i = new Intent(this,DualPlayer.class);
		startActivity(i);
	}
	private void newGame(int c, int r) {
		ROW_COUNT = r;
		COL_COUNT = c;

		cards = new int[COL_COUNT][ROW_COUNT];

		TableRow tr = (TableRow) findViewById(R.id.TableRow);
		mainTable = new TableLayout(context);
		tr.addView(mainTable);

		for (int y = 0; y < ROW_COUNT; y++) {
			mainTable.addView(createRow(y));
		}

		firstCard = null;
		loadCards();
		p1.setText("Player 1:" + Player1Score);
		p1.setTextSize((3*width)/100);
		p2.setText("Player 2:" + Player2Score);
		p2.setTextSize((3*width)/100);
	}
	public void changePlayer(){
		if (statusPlayer1 == true){
			statusPlayer2 = true;
			statusPlayer1 = false;
	//		player2.setStatus(true);
	//		player1.setStatus(false);
			g.check(R.id.radioPlayer2);
			
		}
		else if (statusPlayer2 == true){
		//	player1.setStatus(true);
		//	player2.setStatus(false);
			statusPlayer2 = false;
			statusPlayer1 = true;
			g.check(R.id.radioPlayer1);
		}
	}
	
	private void loadImages() {
		images = new ArrayList<Drawable>();

		images.add(getResources().getDrawable(R.drawable.card1));
		images.add(getResources().getDrawable(R.drawable.card2));
		images.add(getResources().getDrawable(R.drawable.card3));
		images.add(getResources().getDrawable(R.drawable.card4));
		images.add(getResources().getDrawable(R.drawable.card5));
		images.add(getResources().getDrawable(R.drawable.card6));
		images.add(getResources().getDrawable(R.drawable.card7));
		images.add(getResources().getDrawable(R.drawable.card8));
		images.add(getResources().getDrawable(R.drawable.card9));
		images.add(getResources().getDrawable(R.drawable.card10));
		images.add(getResources().getDrawable(R.drawable.card11));
		images.add(getResources().getDrawable(R.drawable.card12));
		images.add(getResources().getDrawable(R.drawable.card13));
		images.add(getResources().getDrawable(R.drawable.card14));
		images.add(getResources().getDrawable(R.drawable.card15));
		

	}

	private void loadCards() {
		try {
			size = ROW_COUNT * COL_COUNT;

			Log.i("loadCards()", "size=" + size);

			ArrayList<Integer> list = new ArrayList<Integer>();

			for (int i = 0; i < size; i++) {
				list.add(new Integer(i));
			}

			Random r = new Random();

			for (int i = size - 1; i >= 0; i--) {
				int t = 0;

				if (i > 0) {
					t = r.nextInt(i);
				}

				t = list.remove(t).intValue();
				cards[i % COL_COUNT][i / COL_COUNT] = t % (size / 2);

				Log.i("loadCards()", "card[" + (i % COL_COUNT) + "]["
						+ (i / COL_COUNT) + "]="
						+ cards[i % COL_COUNT][i / COL_COUNT]);
			}
		} catch (Exception e) {
			Log.e("loadCards()", e + "");
		}

	}

	private TableRow createRow(int y) {
		TableRow row = new TableRow(context);
		row.setHorizontalGravity(Gravity.CENTER);

		for (int x = 0; x < COL_COUNT; x++) {
			row.addView(createImageButton(x, y));
		}
		return row;
	}

	private View createImageButton(int x, int y) {
		Button button = new Button(context);
		button.setBackgroundDrawable(backImage);
		button.setId(100 * x + y);
		button.setOnClickListener(buttonListener);
		return button;
	}

	class ButtonListener implements OnClickListener {

		@Override
		public void onClick(View v) {

			synchronized (lock) {
				if (firstCard != null && seconedCard != null) {
					return;
				}
				int id = v.getId();
				int x = id / 100;
				int y = id % 100;
				turnCard((Button) v, x, y);
			}

		}

		private void turnCard(Button button, int x, int y) {
			button.setBackgroundDrawable(images.get(cards[x][y]));

			if (firstCard == null) {
				firstCard = new Card(button, x, y);
			} else {

				if (firstCard.x == x && firstCard.y == y) {
					return; // the user pressed the same card
				}

				seconedCard = new Card(button, x, y);

		//		turns++;
			//	((TextView) findViewById(R.id.tv1)).setText("Tries: " + turns);
				
				TimerTask tt = new TimerTask() {

					@Override
					public void run() {
						try {
							synchronized (lock) {
								handler.sendEmptyMessage(0);
							}
						} catch (Exception e) {
							Log.e("E1", e.getMessage());
						}
					}
				};

				Timer t = new Timer(false);
				t.schedule(tt, 1300);
			}

		}

	}
	

	class UpdateCardsHandler extends Handler {

		@Override
		public void handleMessage(Message msg) {
			synchronized (lock) {
				checkCards();
				if (checkEndGame == size) {
					displayDialog(Player1Score,Player2Score);
				}
					
			}
		}

		public void checkCards() {
			if (cards[seconedCard.x][seconedCard.y] == cards[firstCard.x][firstCard.y]) {
				firstCard.button.setVisibility(View.INVISIBLE);
				seconedCard.button.setVisibility(View.INVISIBLE);
				if (statusPlayer1 == true){
					Player1Score++;
					p1.setText("Player 1:"+ Player1Score);
					p1.setTextSize((3*width)/100);

				}	
						else if (statusPlayer2== true){
					Player2Score++;

					p2.setText("Player 2:"+ Player2Score);
					p2.setTextSize((3*width)/100);

				}
				checkEndGame+=2;
			} else {
				seconedCard.button.setBackgroundDrawable(backImage);
				firstCard.button.setBackgroundDrawable(backImage);
				changePlayer();
			}
			firstCard = null;
			seconedCard = null;
		}

	}
	
	
}
